﻿
using System;
using System.Collections.Generic;
using System.Linq;
using System.Data.SqlClient;
using System.Data;
using System.Text;
using DAL;
using System.Transactions;

namespace BOL
{ 
    [Serializable]
    public class ProyectoBL
    {
       
        public int addProyectoConstruccion(int idEmpresa,
                        string descripcion,
                        int idActividad,
                        string  Observacion,
                        bool bitActivo)
        {

            using (TransactionScope ts = new TransactionScope())
            {

                dbGestionDataContext _db =
                    new dbGestionDataContext(Parametros.strConnString);

                //datos de la empresa y empleado
                int idUsuarioCre = int.Parse(System.Web.HttpContext.Current.Session["idEmpleado"].ToString());
                

                Proyecto db = new Proyecto();
                    db.addProyectoContruccion(_db,
                    db.getCorrelativo(_db,48), //contruccion
                    descripcion,
                    idActividad,
                    idEmpresa,
                    idUsuarioCre,
                    Observacion,
                    bitActivo);

                    _db.Proyectos.InsertOnSubmit(db);
                    _db.SubmitChanges();
                    ts.Complete();
                return db.idInternal;
            }
        }
        public bool updateProyectoConstruccion(int idEmpresa,
                        int  idProyecto,
                        string descripcion,
                        int idActividad,
                        string Observacion,
                        bool bitActivo)
        {
            bool result = false;
            using (TransactionScope ts = new TransactionScope())
            {
              
                dbGestionDataContext _db =
                    new dbGestionDataContext(Parametros.strConnString);
                //datos de la empresa y empleado
                int idUsuarioCre = int.Parse(System.Web.HttpContext.Current.Session["idEmpleado"].ToString());
                
                Proyecto proyecto = _db.Proyectos.Single(p => p.idInternal == idProyecto);

               

                    proyecto.updateProyectoContruccion(_db, 
                                    descripcion, 
                                    idActividad, 
                                    idEmpresa,
                                    idUsuarioCre, 
                                    Observacion,
                                    bitActivo);
                    _db.SubmitChanges();
                ts.Complete();
                result = true;
            }
            return result;
        }


        public bool delete(int idProyecto)
        {

            bool result = false;
            using (TransactionScope ts = new TransactionScope())
            {

                dbGestionDataContext _db;
                _db = new dbGestionDataContext(Parametros.strConnString);
                
                var proyecto = _db.Proyectos.Single(p=>p.idInternal==idProyecto);

                if (proyecto.Etapas.Count > 0)
                {
                    throw new Exception("Existen Etapas configurados");
                }
                if (proyecto.EmpleadoProys.Count > 0)
                {
                    throw new Exception("Existen Usuarios Asignados al proyecto");
                }
                if (proyecto.CuentaProyectos.Count > 0)
                {
                    throw new Exception("Existen Cuentas configuradas al proyecto");
                }


                _db.Proyectos.DeleteOnSubmit(proyecto);
                _db.SubmitChanges();
                ts.Complete();
                result = true;
            }
            return result;

        }




        public int AddProyectoVenta(int idEmpresa,string descripcion,
                                    bool bitActivo,
                                    int idActividad,
                                    DateTime fechaInicio,
                                    DateTime fechaFin,
                                    string observacion,
                                    string email,
                                    string web,
                                    int idDistrito,
                                    string direccion,
                                    string Referencia,
                                    string NumPartida,
                                    string numTomo,
                                    string numFicha,
                                    string numFoja,
                                    string Sede,
                                    decimal area,
                                    string urbanizacion,
                                    int tipoFinanciamiento,
                                    int? programa,
                                    string codigoPrograma,
                                    DataSet coleccion
                                    )
        {
            using (TransactionScope ts = new TransactionScope())
            {

                //datos de la empresa y empleado
                int idUsuarioCre = int.Parse(System.Web.HttpContext.Current.Session["idEmpleado"].ToString());
                

                dbGestionDataContext _db =
                    new dbGestionDataContext(Parametros.strConnString);

                Proyecto db = new Proyecto();
                db.addProyectoVenta(_db,
                db.getCorrelativo(_db, 50), //Venta
                descripcion,
                idActividad,
                idEmpresa,
                idUsuarioCre,
                observacion,
                fechaInicio,
                fechaFin,
                email,
                web,
                idDistrito,
                direccion,
                Referencia,
                NumPartida,
                numTomo,
                numFicha,
                numFoja,
                Sede,
                area,
                bitActivo,
                urbanizacion,
                tipoFinanciamiento,
                programa,
                codigoPrograma);

                _db.Proyectos.InsertOnSubmit(db);
                _db.SubmitChanges();
                ts.Complete();
                return db.idInternal;
            }


           
        }

        public int UpdateProyectoVenta(int idEmpresa,int idProyecto,
                                    string descripcion,
                                   bool bitActivo,
                                   int idActividad,
                                   DateTime fechaInicio,
                                   DateTime fechaFin,
                                   string observacion,
                                   string email,
                                   string web,
                                   int idDistrito,
                                   string direccion,
                                   string Referencia,
                                   string NumPartida,
                                   string numTomo,
                                   string numFicha,
                                   string numFoja,
                                   string Sede,
                                   decimal area,
                                    string urbanizacion,
                                    int tipoFinanciamiento,
                                    int? programa,
                                    string codigoPrograma,
                                    int? idArchivo,
                                   DataSet coleccion
                                   )
        {
            using (TransactionScope ts = new TransactionScope())
            {

                //datos de la empresa y empleado
                int idUsuarioCre = int.Parse(System.Web.HttpContext.Current.Session["idEmpleado"].ToString());
                

                dbGestionDataContext _db =
                    new dbGestionDataContext(Parametros.strConnString);
                var q = _db.Proyectos.Single(p => p.idInternal == idProyecto);

                var valorArchivo=idArchivo==0?null:idArchivo;

                q.updateProyectoVenta(_db,
                                      
                                        descripcion,
                                        idActividad,
                                        idEmpresa,
                                        idUsuarioCre,
                                        observacion,
                                        fechaInicio,
                                        fechaFin,
                                        email,
                                        web,
                                        idDistrito,
                                        direccion,
                                        Referencia,
                                        NumPartida,
                                        numTomo,
                                        numFicha,
                                        numFoja,
                                        Sede,
                                        area,
                                       
                                        bitActivo,
                                         urbanizacion,
                                         tipoFinanciamiento,
                                        programa,
                                        codigoPrograma,
                                        valorArchivo);

                
                _db.SubmitChanges();
                ts.Complete();
                return q.idInternal;
            }



        }



        public int AddFinanciamiento(int idProyecto,
                       bool bitEsMontoCI,
                       decimal cuotaInicial,
                      
                       int idBancoFinanciera,
                       string comentario,
                       bool bitCuotaEnCuenta)
        {
            using (TransactionScope ts = new TransactionScope())
            {

                dbGestionDataContext _db =
                    new dbGestionDataContext(Parametros.strConnString);

                //datos de la empresa y empleado
                int idUsuarioCre = int.Parse(System.Web.HttpContext.Current.Session["idEmpleado"].ToString());
                int idEmpresa = (int)System.Web.HttpContext.Current.Session["login.Empresa.idEmpresa"];

                DAL.CuentaFinanciamiento db = new DAL.CuentaFinanciamiento();

                db.SetAdd(_db,
                            idProyecto,
                            bitEsMontoCI,
                            cuotaInicial,
                            idBancoFinanciera,
                            comentario,
                            bitCuotaEnCuenta,
                            idUsuarioCre);


                //registramos
                _db.SubmitChanges();
                //DataSet dsDiferencias = new DataSet();
                //string CUENTAPROYECTOITEM = "CuentaProyectoItem";



                //if (ds.HasChanges())
                //{
                //    dsDiferencias.Merge(ds.GetChanges());


                //    foreach (DataRow drw in dsDiferencias.Tables[CUENTAPROYECTOITEM].Rows)
                //    {

                //        if (drw.RowState == DataRowState.Added)
                //        {
                //            CuentaProyectoItem e = new CuentaProyectoItem();

                //            var dataRow = (CuentaProyectoItemInfo)Util.DataRowToEntidad(drw, e.GetType());


                //            e.AddSet(_db,
                //                dataRow.idProyecto,
                //                db.idInternal
                //                );
                //        }
                //        _db.SubmitChanges();

                //    }
                //}
                ////actualiza el total
                ts.Complete();
                return db.idInternal;

            }

        }


        public void UpdateFinanciamiento(int idCuentaProyecto,
                            int idProyecto,
                            bool bitEsMontoCI,
                            decimal cuotaInicial,
                            bool bitActivo,
                            int idCuenta,
                            int idBancoFinanciera,
                            string comentario,
                            bool bitCuotaEnCuenta)
        {
            using (TransactionScope ts = new TransactionScope())
            {

                dbGestionDataContext _db =
                    new dbGestionDataContext(Parametros.strConnString);

                //datos de la empresa y empleado
                int idUsuarioCre = int.Parse(System.Web.HttpContext.Current.Session["idEmpleado"].ToString());
                int idEmpresa = (int)System.Web.HttpContext.Current.Session["login.Empresa.idEmpresa"];

                var db = _db.CuentaFinanciamientos.Single(p => p.idInternal == idCuentaProyecto);

                db.SetUpdate(_db,
                 
                    bitEsMontoCI,
                    cuotaInicial,
               
                    comentario,
                    bitCuotaEnCuenta,
                    idUsuarioCre);
                //registramos las UI
                _db.SubmitChanges();
                //DataSet dsDiferencias = new DataSet();
                //string CUENTAPROYECTOITEM = "CuentaProyectoItem";



                //if (ds.HasChanges())
                //{
                //    dsDiferencias.Merge(ds.GetChanges());


                //    foreach (DataRow drw in dsDiferencias.Tables[CUENTAPROYECTOITEM].Rows)
                //    {
                //        if (drw.RowState == DataRowState.Modified)
                //        {


                //            CuentaProyectoItem e = _db.CuentaProyectoItems.Single(p => p.idInternal == drw.Field<int>("idInternal"));

                //            var dataRow = (CuentaProyectoItem)Util.DataRowToEntidad(drw, e.GetType());

                //            e.AddUpdate(_db,
                //                        dataRow.idProyecto);

                //            _db.SubmitChanges();

                //        }

                //        if (drw.RowState == DataRowState.Deleted)
                //        {
                //            drw.RejectChanges();

                //            ProformaItem erol = _db.ProformaItems.Single(p => p.idInternal == drw.Field<int>("idInternal"));
                //            _db.ProformaItems.DeleteOnSubmit(erol);
                //            _db.SubmitChanges();
                //        }

                //        if (drw.RowState == DataRowState.Added)
                //        {
                //            ProformaItem e = new ProformaItem();

                //            var dataRow = (ProformaItemInfo)Util.DataRowToEntidad(drw, e.GetType());

                //            e.SetAdd(_db,
                //              dataRow.idUI,
                //              dataRow.total,
                //              db.idInternal
                //              );
                //        }
                //        _db.SubmitChanges();

                //    }
                //   }

                _db.SubmitChanges();
                ts.Complete();

            }

        }


        public void DeleteFinanciamiento(int idCuentaProyecto)
        {
            using (TransactionScope ts = new TransactionScope())
            {

                dbGestionDataContext _db =
                    new dbGestionDataContext(Parametros.strConnString);

                //datos de la empresa y empleado
                int idUsuarioCre = int.Parse(System.Web.HttpContext.Current.Session["idEmpleado"].ToString());
                int idEmpresa = (int)System.Web.HttpContext.Current.Session["login.Empresa.idEmpresa"];




                var db = _db.CuentaFinanciamientos.Single(p => p.idInternal == idCuentaProyecto);


                if (db.CuentaProyectoItems.Count > 0)
                {
                    throw new Exception("La cuenta se encuetra configurado en Etapas");
                }
                _db.CuentaFinanciamientos.DeleteOnSubmit(db);


                _db.SubmitChanges();
                ts.Complete();

            }
        }




        public List<ProyectoCuentaInfo> GetProyectoCuenta(int idProyecto)
        {
            var q = from a in DbUtil.Db.CuentaProyectos
                    where a.idProyecto == idProyecto
                    select new ProyectoCuentaInfo
                    {
                        descripcion = string.Format("{0}: {1}:{2}", a.CuentaBanco.Banco.descripcion, a.CuentaBanco.Moneda.descripcion, a.CuentaBanco.descripcion),
                        idCuentaBanco = a.idCuentaBanco,
                        idInternal = a.idInternal,
                        bitActivo = a.bitActivo
                    };

            return q.ToList();
        }

    }
}
